Code
import requests
import pandas as pd
import geopandas«Contains data under the Norwegian licence for Open Government data (NLOD) distributed by the Norwegian Public Roads Administration.»
import requests
import pandas as pd
import geopandas
url = "https://trafikkdata-api.atlas.vegvesen.no"
headers = {
"content-type": "application/json"
}
data = {
"query": """
{
trafficRegistrationPoints(searchQuery: {roadCategoryIds: [E, R, F, K, P] }) {
id
name
trafficRegistrationType
commissions {
validFrom
validTo
lanes {
laneNumberAccordingToRoadLink
laneNumberAccordingToMetering
}
}
direction {
fromAccordingToRoadLink
fromAccordingToMetering
toAccordingToRoadLink
toAccordingToMetering
}
manualLabels {
validFrom
validTo
affectedLanes {
lane {
laneNumberAccordingToRoadLink
laneNumberAccordingToMetering
}
states
}
}
operationalStatus
registrationFrequency
dataTimeSpan {
firstData
firstDataWithQualityMetrics
latestData {
volumeByHour
volumeByDay
volumeAverageDailyByMonth
volumeAverageDailyBySeason
volumeAverageDailyByYear
}
}
location {
coordinates {
latLon {
lat
lon
}
}
}
}
}
""",
"variables": None
}
response = requests.post(url, headers=headers, json=data)
df_sensors = pd.json_normalize(response.json()['data']['trafficRegistrationPoints'])
df_sensors| id | name | trafficRegistrationType | commissions | manualLabels | operationalStatus | registrationFrequency | direction.fromAccordingToRoadLink | direction.fromAccordingToMetering | direction.toAccordingToRoadLink | direction.toAccordingToMetering | dataTimeSpan.firstData | dataTimeSpan.firstDataWithQualityMetrics | dataTimeSpan.latestData.volumeByHour | dataTimeSpan.latestData.volumeByDay | dataTimeSpan.latestData.volumeAverageDailyByMonth | dataTimeSpan.latestData.volumeAverageDailyBySeason | dataTimeSpan.latestData.volumeAverageDailyByYear | location.coordinates.latLon.lat | location.coordinates.latLon.lon | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 52742V2282262 | Ørbekk | VEHICLE | [{'validFrom': '2002-01-01T00:00:00+01:00', 'v... | [{'validFrom': '2023-06-27T05:00:00+02:00', 'v... | OPERATIONAL | CONTINUOUS | OSLO | OSLO | HAMAR | HAMAR | 2002-01-01T00:00:00+01:00 | 2016-04-25T09:00:00+02:00 | 2025-05-28T15:00:00+02:00 | 2025-05-28T00:00:00+02:00 | 2025-04-01T00:00:00+02:00 | 2024-12-01T00:00:00+01:00 | 2024-01-01T00:00:00+01:00 | 60.414260 | 11.241171 |
| 1 | 41517V704478 | BASTERUD | VEHICLE | [{'validFrom': '2002-01-01T00:00:00+01:00', 'v... | [] | RETIRED | PERIODIC | FRA KOLOMOENX3 | FRA KOLOMOENX3 | FRA HAMAR | FRA HAMAR | 2002-01-01T00:00:00+01:00 | 2015-04-24T12:00:00+02:00 | 2017-11-14T12:00:00+01:00 | 2017-11-14T00:00:00+01:00 | 2017-11-01T00:00:00+01:00 | 2017-09-01T00:00:00+02:00 | 2017-01-01T00:00:00+01:00 | 60.769163 | 11.171156 |
| 2 | 01050V1126115 | Trollvika | VEHICLE | [{'validFrom': '2016-04-07T09:15:12.73+02:00',... | [] | OPERATIONAL | CONTINUOUS | Gisund bru | Gisund bru | Bjorelvnes | Bjorelvnes | 2016-04-07T09:00:00+02:00 | 2016-04-07T09:00:00+02:00 | 2025-05-28T15:00:00+02:00 | 2025-05-28T00:00:00+02:00 | 2025-04-01T00:00:00+02:00 | 2024-12-01T00:00:00+01:00 | 2024-01-01T00:00:00+01:00 | 69.239206 | 17.981692 |
| 3 | 24748V22148 | Pinesund | VEHICLE | [{'validFrom': '2006-01-03T13:00:00+01:00', 'v... | [{'validFrom': '2019-05-23T19:00:00+02:00', 'v... | OPERATIONAL | CONTINUOUS | Brokelandsheia | AKLAND | AKLAND | Brokelandsheia | 2006-01-03T13:00:00+01:00 | 2018-05-25T16:00:00+02:00 | 2025-05-28T15:00:00+02:00 | 2025-05-28T00:00:00+02:00 | 2025-04-01T00:00:00+02:00 | 2024-12-01T00:00:00+01:00 | 2024-01-01T00:00:00+01:00 | 58.798454 | 9.054728 |
| 4 | 11446V1175840 | Melsomvik | VEHICLE | [{'validFrom': '1990-04-17T14:00:00+02:00', 'v... | [{'validFrom': '2018-04-06T00:00:00+02:00', 'v... | OPERATIONAL | CONTINUOUS | SANDEFJORD | SANDEFJORD | TØNSBERG | TØNSBERG | 1990-04-17T14:00:00+02:00 | 2018-04-04T14:00:00+02:00 | 2025-05-28T15:00:00+02:00 | 2025-05-28T00:00:00+02:00 | 2025-04-01T00:00:00+02:00 | 2024-12-01T00:00:00+01:00 | 2024-01-01T00:00:00+01:00 | 59.229469 | 10.338938 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 9008 | 02510V384266 | Haukåsvegen 1 | VEHICLE | [{'validFrom': '2025-02-05T10:17:27+01:00', 'v... | [] | OUT_OF_SERVICE | PERIODIC | Kaupanger | Kaupanger | Haukåsen | Haukåsen | 2025-02-05T10:00:00+01:00 | 2025-02-05T10:00:00+01:00 | 2025-02-13T10:00:00+01:00 | 2025-02-13T00:00:00+01:00 | None | None | 2025-01-01T00:00:00+01:00 | 61.186571 | 7.217449 |
| 9009 | 01681V704686 | Akershus grense | VEHICLE | [{'validFrom': '2025-04-24T15:26:51+02:00', 'v... | [] | OUT_OF_SERVICE | PERIODIC | Åsnes | Åsnes | Disenå | Disenå | 2025-04-24T15:00:00+02:00 | 2025-04-24T15:00:00+02:00 | 2025-05-08T13:00:00+02:00 | 2025-05-08T00:00:00+02:00 | None | None | 2025-01-01T00:00:00+01:00 | 60.174021 | 11.573360 |
| 9010 | 80804V704933 | Spikset gardstegelverk | VEHICLE | [{'validFrom': '2025-04-24T14:36:23+02:00', 'v... | [] | OUT_OF_SERVICE | PERIODIC | Togstad | Togstad | Sandnesmoen | Sandnesmoen | 2025-04-24T14:00:00+02:00 | 2025-04-24T14:00:00+02:00 | 2025-05-09T15:00:00+02:00 | 2025-05-09T00:00:00+02:00 | None | None | 2025-01-01T00:00:00+01:00 | 60.238495 | 11.651985 |
| 9011 | 03081V971839 | Ringstad ved Nylende | VEHICLE | [{'validFrom': '2025-04-23T13:22:31+02:00', 'v... | [] | OUT_OF_SERVICE | PERIODIC | Nylende | Nylende | Liane | Liane | 2025-04-23T13:00:00+02:00 | 2025-04-23T13:00:00+02:00 | 2025-05-11T04:00:00+02:00 | 2025-05-11T00:00:00+02:00 | None | None | 2025-01-01T00:00:00+01:00 | 59.306555 | 10.970183 |
| 9012 | 62357V578651 | Sundsøya | VEHICLE | [{'validFrom': '2025-02-18T13:20:54+01:00', 'v... | [] | OUT_OF_SERVICE | PERIODIC | Røra | Røra | Straumen | Straumen | 2025-02-18T13:00:00+01:00 | 2025-02-18T13:00:00+01:00 | 2025-02-28T08:00:00+01:00 | 2025-02-28T00:00:00+01:00 | None | None | 2025-01-01T00:00:00+01:00 | 63.865429 | 11.300386 |
9013 rows × 20 columns
gdf_sensors = geopandas.GeoDataFrame(
df_sensors,
geometry=geopandas.points_from_xy(
df_sensors['location.coordinates.latLon.lon'],
df_sensors['location.coordinates.latLon.lat']
),
crs="EPSG:4326"
)
gdf_sensors.explore()